home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume2 / dos / qcat.1 next >
Text File  |  1988-12-28  |  40KB  |  1,074 lines

  1. Path: xanth!nic.MR.NET!csd4.milw.wisc.edu!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v02i100:  qcat - quick disk catalog
  5. Message-ID: <10929@swan.ulowell.edu>
  6. Date: 28 Dec 88 17:18:58 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 1063
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: elbaum%REED.BITNET@CUNYVM.CUNY.EDU (Daniel Elbaum)
  12. Posting-number: Volume 2, Issue 100
  13. Archive-name: dos/qcat.1
  14.  
  15. Qcat prints out the full pathname of each file in a series of disks or
  16. a list of directories.  It's small and speedy, just perfect for 90% of
  17. what one wants from a disk catalogger, but with none of the bells and
  18. whistles which, I find, sometimes get in the way.
  19.  
  20. [uuencoded executable included.  ..Bob]
  21.  
  22. #    This is a shell archive.
  23. #    Remove everything above and including the cut line.
  24. #    Then run the rest of the file through sh.
  25. #----cut here-----cut here-----cut here-----cut here----#
  26. #!/bin/sh
  27. # shar:    Shell Archiver
  28. #    Run the following text with /bin/sh to create:
  29. #    qcat.c
  30. #    qcat.doc
  31. #    qcat.uu
  32. # This archive created: Wed Dec 28 12:15:22 1988
  33. cat << \SHAR_EOF > qcat.c
  34.  
  35. /***********************************************************************
  36.  
  37.     11/88
  38.  
  39.     QCAT v0.01 -- List files on disks or in directories
  40.  
  41.                          -----------------
  42.  
  43.                    Copyright (C) 1988 by Daniel Elbaum
  44.  
  45.          This software is freely redistributable provided that:
  46.          the three files which comprise it (qcat, qcat.c, qcat.doc)
  47.          remain intact; all copyright notices contained in any of
  48.          the aforementioned files remain intact; and no fee beyond
  49.          reasonable remuneration for collation and distribution be
  50.          charged for use and/or purveyance.
  51.  
  52. ***********************************************************************/
  53.  
  54. #include <stdio.h>
  55. #include <exec/types.h>
  56. #include <exec/memory.h>
  57. #include <libraries/dos.h>
  58. #include <libraries/dosextens.h>
  59. #include <intuition/intuition.h>
  60.  
  61. /* Error descriptor codes */
  62.  
  63. #define E_NOLOCK    (-1)
  64. #define E_NOMEM     (-2)
  65. #define E_NOEXAM    (-3)
  66. #define E_USAGE     (-4)
  67. #define E_OUTPUT    (-5)
  68. #define E_LIBRARY   (-6)
  69. #define E_NONODE    (-100)
  70. #define E_NOSTRING  (-101)
  71.  
  72. /* Manifest constants */
  73.  
  74. #define NAMSIZ      (108)
  75. #define MEMFLOOR    (64000L)    /* least amt of mem to leave    */
  76.  
  77. #define IREV    (1)
  78. #define INAM    ("intuition.library")
  79.  
  80. /* Global data, type and function declarations */
  81. typedef struct IntuitionBase* ib_t;
  82.  
  83. ib_t IntuitionBase=NULL;
  84. void *OpenLibrary();
  85.  
  86. FILE *ofp;
  87.  
  88. struct {
  89.     char filenam[NAMSIZ*10];
  90.     } fs;
  91.  
  92. struct namlist {
  93.     char *nam;
  94.     struct namlist *next;
  95.     } nlist;
  96.  
  97. /*
  98.     Acts like a state machine, the state of which
  99.     is determined by the combination of arguments
  100.     supplied.  The while loop sets the state, while
  101.     the if switches select action taken according
  102.     thereto.
  103. */
  104.  
  105. main(c, v)
  106. char **v;
  107. {
  108.     register active;
  109.     register err;
  110.     char *cdrive=NULL;
  111.     char *onam=NULL;
  112.     char bu[NAMSIZ*10];
  113.     char *getcd();
  114.     char *realnam();
  115.     void getrspinit(), freelist();
  116.  
  117.  
  118.     ++v;
  119.     while (**v == '-'){
  120.         switch(*++*v){
  121.             case 'o':   /* specify output file  */
  122.                 if (!*++v) {prerr(NULL, E_USAGE); exit(10);}
  123.                 else {onam=*v; ++v;}
  124.                 break;
  125.             case 'c':   /* continuous listing of 1 drive    */
  126.                 if (!*++v) {prerr(NULL, E_USAGE); exit(10);}
  127.                 else {cdrive=*v; ++v;}
  128.                 if (!(IntuitionBase=(ib_t)OpenLibrary(INAM, IREV))){
  129.                     prerr(NULL, E_LIBRARY); exit(10);
  130.                 }
  131.                 break;
  132.             default:
  133.                 prerr(NULL, E_USAGE);
  134.                 exit(10);
  135.         }
  136.     }
  137.  
  138.     if (onam){
  139.         if (!(ofp=fopen(onam, "w"))){
  140.             prerr(onam, E_OUTPUT);
  141.             exit(10);
  142.         }
  143.     }
  144.     else ofp=stdout;
  145.  
  146.     if (cdrive){
  147.         getrspinit();
  148.         if (getresponse()!=FALSE){
  149.             for (active=1; active; ){
  150.                 realnam(cdrive, fs.filenam);    /* seed pathname    */
  151.                 if (err=getnams(cdrive)) prerr(cdrive, err);
  152.                 if (getresponse()==FALSE) active=0;
  153.             }
  154.         }
  155.     }
  156.     else if (!*v){
  157.         getcd(bu);
  158.         strcpy(fs.filenam, bu);
  159.         if (err=getnams(bu)) prerr(bu, err);
  160.     }
  161.     else{
  162.         for (; *v; ++v){
  163.             realnam(*v, fs.filenam);            /* seed pathname    */
  164.             if (err=getnams(*v)) prerr(*v, err);
  165.         }
  166.     }
  167.     prlist(ofp, &nlist);
  168.     freelist(&nlist);
  169.     if (ofp!=stdout) fclose(ofp);
  170.     if (IntuitionBase) CloseLibrary(IntuitionBase);
  171.     exit(0);
  172. }
  173.  
  174. /*
  175.     If nam is the name of a file, add its size to the global counter.
  176.     If nam is the name of a directory, saunter down a level and
  177.     grab info for its files.
  178.     Return a coded description of any error which occurs, or zero
  179.     if success was the order of the day.
  180. */
  181.  
  182. getnams(nam)
  183. char *nam;
  184. {
  185.     register struct FileLock *l=NULL;
  186.     register struct FileInfoBlock *f=NULL;
  187.     register err=0;
  188.     struct FileLock *Lock();
  189.     void addtonam(), truncnam();
  190.  
  191.     if (!nam) return(E_NOEXAM);
  192.     if (!(l=Lock(nam, ACCESS_READ))){
  193.         return(E_NOLOCK);
  194.     }
  195.     if (!(f=(struct FileInfoBlock *)AllocMem((ULONG)sizeof(*f), MEMF_PUBLIC))) {
  196.         UnLock(l);
  197.         return(E_NOMEM);
  198.     }
  199.     if (!Examine(l, f)) {
  200.         UnLock(l);
  201.         FreeMem(f, (ULONG)sizeof(*f));
  202.         return(E_NOEXAM);
  203.     }
  204.     if (f->fib_DirEntryType<0){     /* file */
  205.         addnam(nam, &nlist);
  206.     }
  207.     else {
  208.         while (ExNext(l, f)){     /* directory    */
  209.             addtonam(fs.filenam, f->fib_FileName);
  210.             if (err=getnams(fs.filenam)) break;
  211.             truncnam(fs.filenam);        /* delete filename from path    */
  212.         }
  213.     }
  214.     UnLock(l);
  215.     FreeMem(f, (ULONG)sizeof(*f));
  216.     return(err);
  217. }
  218.  
  219. /*
  220.     Assuming p points to a valid pathname and s to a valid filename,
  221.     append the filename to the pathname.
  222. */
  223.  
  224. void
  225. addtonam(p, s)
  226. register char *p, *s;
  227. {
  228.     register char *op=p;
  229.  
  230.     while (*p)
  231.         p++;
  232.     if (p!=op){
  233.         if (*--p!=':')
  234.             *++p='/';
  235.         p++;
  236.     }
  237.     while (*s)
  238.         *p++=*s++;
  239.     *p='\0';
  240. }
  241.  
  242. /*
  243.     Assuming p points to a valid pathname, clip the filename from it.
  244. */
  245.  
  246. void
  247. truncnam(p)
  248. register char *p;
  249. {
  250.     register char *pp;
  251.  
  252.     if (!p) return;
  253.     for (pp=p; *pp; pp++)
  254.         ;
  255.     while (*pp!='/'&&*pp!=':'&&pp>p)
  256.         --pp;
  257.     if (*pp==':') ++pp;
  258.     *pp='\0';
  259. }
  260.  
  261. /*
  262.     Build a real pathname from the filename,
  263.     dirname, or drivename specifiecd in nam
  264.     into bu.  Return a pointer to bu on success,
  265.     or NULL if the chore is beyond doing.
  266. */
  267.  
  268. char *
  269. realnam(nam, bu)
  270. char *nam, *bu;
  271. {
  272.     register addcol;
  273.     register struct FileLock *l=NULL;
  274.     struct FileLock *Lock();
  275.  
  276.     if (!nam||!bu) return(NULL);
  277.     if (nam[strlen(nam)-1]==':') addcol=1;
  278.     else addcol=0;
  279.     if (!(l=Lock(nam, ACCESS_READ))){
  280.         return(NULL);
  281.     }
  282.     fullnam(l, bu);
  283.     UnLock(l);
  284.     return(bu);
  285. }
  286.  
  287.  
  288. /*
  289.     Put the full name of the current
  290.     directory into the supplied buffer
  291.     and return a pointer to it.
  292. */
  293.  
  294. char *
  295. getcd(bu)
  296. char *bu;
  297. {
  298.     struct FileLock *ol;
  299.  
  300.     if (!bu) return(NULL);
  301.     fullnam(ol=CurrentDir(0L), bu);
  302.     CurrentDir(ol);
  303.     return(bu);
  304. }
  305.  
  306. /*
  307.     Put the full pathname of a
  308.     locked file in the given buffer
  309.     and return a pointer to it.
  310. */
  311.  
  312. char *
  313. fullnam(l, bu)
  314. register struct FileLock *l;
  315. char *bu;
  316. {
  317.     register len;
  318.     struct FileLock *nl, *ParentDir();
  319.     char bu2[NAMSIZ];
  320.     char ebu[NAMSIZ*10];
  321.  
  322.     if (!l||!bu) return(NULL);
  323.     bu2[0]=0;
  324.     locknam(l, bu);
  325.     while (l=ParentDir(l)){
  326.         if (locknam(l, bu2)){
  327.             sprintf(ebu, "%s/%s", bu2, bu);
  328.             strcpy(bu, ebu);
  329.         }
  330.         else break;
  331.     }
  332.     if (bu2[0]) bu[strlen(bu2)]=':';
  333.     else {bu[len=strlen(bu)]=':'; bu[len+1]='\0';}
  334.     return(bu);
  335. }
  336.  
  337. /*
  338.     Put the name of the file or directory
  339.     associated with the given lock into
  340.     the given buffer and return a pointer
  341.     to it or NULL if it couldn't be done.
  342. */
  343.  
  344. char *
  345. locknam(l, bu)
  346. register struct FileLock *l;
  347. char *bu;
  348. {
  349.     register struct FileInfoBlock *f=NULL;
  350.  
  351.     if (!l||!bu) return(NULL);
  352.     if (!(f=(struct FileInfoBlock *)AllocMem((ULONG)sizeof(*f), MEMF_PUBLIC))) {
  353.         return(NULL);
  354.     }
  355.     if (!Examine(l, f)) {
  356.         FreeMem(f, (ULONG)sizeof(*f));
  357.         return(NULL);
  358.     }
  359.     strcpy(bu, f->fib_FileName);
  360.     FreeMem(f, (ULONG)sizeof(*f));
  361.     return(bu);
  362. }
  363.  
  364. /*
  365.     Add a name to the end of the filename list.
  366.     Could be more efficient, but the bottleneck
  367.     is disk speed.  Return a descriptive error
  368.     value on failure.
  369. */
  370.  
  371. addnam(s, lp)
  372. char *s;
  373. struct namlist *lp;
  374. {
  375.     struct namlist *newnode();
  376.     char *strsave();
  377.     void freelist(), prlist();
  378.  
  379.     if (!s||!lp) return(-1);
  380.     if (amtfree()<MEMFLOOR){        /* dump if mem full */
  381.         prlist(ofp, lp);
  382.         freelist(lp);
  383.     }
  384.     while (lp->next)
  385.         lp=lp->next;
  386.     if (!(lp->next=newnode()))
  387.         return(E_NONODE);    /* won't happen.  Better not.   */
  388.     if (!(lp->next->nam=strsave(s)))
  389.         return(E_NOSTRING);
  390.     return(0);
  391. }
  392.  
  393. /*
  394.     Allocate a new node for the filename list.
  395.     Return a pointer to it or NULL if there's
  396.     not enough memory.
  397. */
  398.  
  399. struct namlist *
  400. newnode()
  401. {
  402.     register struct namlist *mp;
  403.  
  404.     if (mp=(struct namlist *)malloc(sizeof(struct namlist))){
  405.         mp->nam=NULL;
  406.         mp->next=NULL;
  407.     }
  408.     return(mp);
  409. }
  410.  
  411. /*
  412.     Free the filename list.
  413. */
  414.  
  415. void
  416. freelist(lp)
  417. struct namlist *lp;
  418. {
  419.     struct namlist *p;
  420.  
  421.     if (!lp) return;
  422.     lp=lp->next;    /*  don't free 1st item */
  423.     while (lp){
  424.         p=lp->next;
  425.         free(lp->nam);
  426.         free(lp);
  427.         lp=p;
  428.     }
  429. }
  430.  
  431. /*
  432.     Print out the filename list.
  433. */
  434.  
  435. void
  436. prlist(fp, lp)
  437. FILE *fp;
  438. struct namlist *lp;
  439. {
  440.     if (!lp||!fp) return;
  441.     lp=lp->next;    /* don't print 1st item */
  442.     while (lp){
  443.         fprintf(fp, "%s\n", lp->nam);
  444.         lp=lp->next;
  445.     }
  446. }
  447.  
  448. /*
  449.     An old favorite.
  450. */
  451.  
  452. char *
  453. strsave(s)
  454. char *s;
  455. {
  456.     register len;
  457.     register char *mp;
  458.  
  459.     if (!s) return(NULL);
  460.     if (mp=malloc(len=strlen(s)+1))
  461.         memcpy(mp, s, len);
  462.     return(mp);
  463. }
  464.  
  465. /*
  466.     Report amount of free memory in the system.
  467.     Errors not allowed here.
  468. */
  469.  
  470. ULONG
  471. amtfree()
  472. {
  473.     ULONG c, f;
  474.  
  475.     Forbid();
  476.     c=AvailMem(MEMF_CHIP);
  477.     f=AvailMem(MEMF_FAST);
  478.     Permit();
  479.     return(c+f);
  480. }
  481.  
  482. /*
  483.     Print a message corresponding to the error given,
  484.     prompting with s, if nonnull.
  485.     Return the error given.
  486. */
  487.  
  488. prerr(s, err)
  489. char *s;
  490. {
  491.     register char *errp;
  492.  
  493.     switch (err){
  494.         case E_NOMEM:
  495.             errp="Out of memory"; break;
  496.         case E_NOEXAM:
  497.             errp="Couldn't examine"; break;
  498.         case E_NOLOCK:
  499.             errp="File not found"; break;
  500.         case E_OUTPUT:
  501.             errp="Can't open output file"; break;
  502.         case E_USAGE:
  503.             errp="Usage: qcat [-o outputfile] [-c drivename] or \n\
  504. qcat [-o outputfile] dirname";
  505.             break;
  506.         case E_LIBRARY:
  507.             errp="Couldn't open intuition.library";
  508.             break;
  509.         default:    /* NOTREACHED   */
  510.             errp="grievous error"; break;
  511.     }
  512.     if (s) printf("%s: %s\n", s, errp);
  513.     else printf("%s\n", errp);
  514.     return(err);
  515. }
  516.  
  517. /*
  518.     Set up the AutoRequest stuff, and use the
  519.     automatic requestor to tell the user when
  520.     to change disks, let them quit, and return
  521.     when they do so.
  522. */
  523.  
  524. char *rsp_bod0="Insert a disk";
  525. char *rsp_bod1="Next disk";
  526. char *rsp_no="Quit";
  527. char *rsp_yes="Redo";
  528.  
  529. struct response {
  530.     struct IntuiText bod;
  531.     struct IntuiText no;
  532.     ULONG yflg;
  533.     struct Window *w;
  534.     } rsp;
  535.  
  536. /*
  537.     Initialize the autorequestor's data and
  538.     find a window to put it in. Return nonzero
  539.     on failure, zero on success.
  540. */
  541.  
  542. getrspinit()
  543. {
  544.     rsp.bod.FrontPen=0;
  545.     rsp.bod.BackPen=1;
  546.     rsp.bod.DrawMode=JAM1;
  547.     rsp.bod.LeftEdge=6;
  548.     rsp.bod.TopEdge=3;
  549.     rsp.bod.ITextFont=NULL;
  550.     rsp.bod.IText=rsp_bod0;
  551.     rsp.bod.NextText=NULL;
  552.  
  553.     rsp.no=rsp.bod;
  554.     rsp.no.IText=rsp_no;
  555.  
  556.     rsp.yflg=DISKINSERTED;
  557.  
  558.     return(!(rsp.w=getCLIwin()));
  559. }
  560.  
  561. /*
  562.     Return a pointer to a window for
  563.     the requestor.  If there be none,
  564.     return NULL.
  565. */
  566.  
  567. struct Window *
  568. getCLIwin()
  569. {
  570.     register struct Screen *sp;
  571.     register struct Window *wp;
  572.  
  573.     return(IntuitionBase->ActiveWindow);
  574. }
  575.  
  576. /*
  577.     Post a requestor asking for a new
  578.     disk.  The first time called, just
  579.     ask for the first disk; after that,
  580.     ask for the next.  Return the boolean
  581.     value of the user's response.
  582. */
  583.  
  584. getresponse()
  585. {
  586.     register rv=0;
  587.  
  588.     rv=AutoRequest(rsp.w, &rsp.bod, NULL, &rsp.no, rsp.yflg, 0L, 200, 50);
  589.     rsp.bod.IText=rsp_bod1;
  590.     return(rv);
  591. }
  592.  
  593.  
  594. SHAR_EOF
  595. cat << \SHAR_EOF > qcat.doc
  596.  
  597.     11/88
  598.  
  599.  
  600.     QCAT v0.01 -- List files on disks or in directories
  601.  
  602.  
  603.                          -----------------
  604.  
  605.                    Copyright (C) 1988 by Daniel Elbaum
  606.  
  607.          This software is freely redistributable provided that:
  608.          the three files which comprise it (qcat, qcat.c, qcat.doc)
  609.          remain intact; all copyright notices contained in any of
  610.          the aforementioned files remain intact; and no fee beyond
  611.          reasonable remuneration for collation and distribution be
  612.          charged for use and/or purveyance.
  613.  
  614.                          -----------------
  615.  
  616.     Syntax:
  617.         qcat [-o filename] [dirname ...]
  618.     or
  619.         qcat [-o filename] -c drive
  620.  
  621.  
  622.     Qcat simply produces a listing of the full pathname of all
  623.     files in a list of directories or in a series of disks.
  624.  
  625.     With no arguments, a list is produced of the files in the
  626.     current directory and all its sub directories.
  627.  
  628.     -o redirects the list to a file of the specified name, wiping
  629.     out any file of that name which may already exist.
  630.  
  631.     -c causes a continuous listing of a single drive.  A requestor
  632.     comes up prompting for a disk to be inserted; the names of the
  633.     files on that disk are read, and the requestor comes back asking
  634.     for the next disk.  When all the disks you want to catalog have
  635.     been fed in, click on the 'Quit' gadget, and the complete file
  636.     list will be output.
  637.  
  638.     Instead of -c and a drive name, a bunch of directory names can
  639.     be given on the command line.  A single list will be output of
  640.     all the files in all the specified directories and their sub-
  641.     directories.
  642.  
  643.     Nota Bene:
  644.  
  645.     The list won't be sorted.  There are plenty of utilities out
  646.     there which sort files by line, so I didn't want to bloat
  647.     this program with the extra functionality.  If enough people
  648.     want a sorting option, I'll add one.
  649.  
  650.     If the directory trees to be listed are deep (lots of sub-
  651.     directories), the be sure to set the stack size to something
  652.     like 10000 or so, since the recursive routine that does the
  653.     spelunking is pretty stack-hungry.
  654.  
  655.     The purpose of qcat is to list disks or directories, given a
  656.     simple command line, without involving the user in an interactive
  657.     experience.  One good use for it is to make a listing for a set
  658.     of disks, then use the list to find out where particular files
  659.     are located.  Should come in handy for those Fish disks, eh?
  660.  
  661.     The way it works is to keep a linked list of filenames in memory
  662.     until all disks or directories have been read, and then to dump
  663.     the list.  If memory gets low, the list will be dumped several
  664.     times during the reading, so even if you have lots of disks to
  665.     look at or not much memory or both, qcat should function smoothly.
  666.  
  667.  
  668.     If you want to send me money for qcat, then by all means
  669.     do so--many projects are in progress and I need financing.
  670.     $5.00 is recommended.  Make checks payable to:
  671.  
  672.     Daniel Elbaum
  673.     Amaranth Software
  674.     4816 SE Bybee Blvd.
  675.     Portland, Ore. 97206
  676.  
  677.  
  678.     Send comments, suggestions, and flames to:
  679.  
  680.     Daniel Elbaum
  681.     Portland bbs: Amigaboard!, NAG, HABIT
  682.     UUCP: ...!tektronix!reed!elbaum
  683.     ARPA: elbaum@reed.EDU
  684.  
  685.  
  686.  
  687.  
  688.  
  689. SHAR_EOF
  690. cat << \SHAR_EOF > qcat.uu
  691.  
  692. begin 644 qcat
  693. M```#\P`````````&``````````4````"```#8P``"CP```!&````)`````T`F
  694. M``/I`````D[Y```````````#[`````$````"`````@````````/R```#Z@``+
  695. M`V,`(0`!``````````````````````````#_________________________U
  696. M______\`````````````````````````````````````````````````````[
  697. M`````````````````````````````````````````````````````````````
  698. M`````````````````````````````````````````````````````````````
  699. M`````````````````````````````````````````````````````````````
  700. M`````````````````````````````````````````````````````````````
  701. M`````````````````````````````````````````````````````````````
  702. M`````````````````````````````````````````````````````````````
  703. M`````````````````````````````````````````````````````````````
  704. M`````````````````````````````````````````````````````````````
  705. M`````````````````````````````````````````````````````````````
  706. M`````````````````````````````````````````````````````````````
  707. M`````````````````````````````````````````````````````````````
  708. M`````````````````````````````````````````````````````````````
  709. M`````````````````````````````````````````````````````````````
  710. M`````````````````````````````````````````````````````````````
  711. M`````````````````````````````````````````````````````````````
  712. M`````````````````````````````````````````````````````````````
  713. M`````````````````````````````````````````````````````````````
  714. M`````````````````````````````````````````````````````````````
  715. M`````````````````````````````````````````````````````````````
  716. M`````````````````````````````````````````````````````````````
  717. M`````````````````````````````````````````````````````````````
  718. M`````````````````````````````````````````````````````````````
  719. M`````````````````````````````````````````````````````````````
  720. M`````````````````````````````````````````````````````````````
  721. M`````````````````````````````````````````````````````````````
  722. M`````````````````````````````````````````````````````````````
  723. M`````````````````````````````````````````````````````````````
  724. M`````````````````````````````````````````````````````````````
  725. M`````````````````````````````````````````````````````````````
  726. M`````````````````````````````````````````````````````````````
  727. M`````````````````````````````````````````````````````````````
  728. M`````````````````````````````````````````````````````````````
  729. M````````````````````````#(8```Q\```,=@``#'``````````````````8
  730. M`````````````````````````````````````````````````!Z"````````@
  731. M`````````````````````````````````````````````````````````````
  732. M`````````````````````````````````````````````````````````````
  733. M`````````````````````````````````````````````````````````````
  734. M`````````````````````````````````````````````````````````````
  735. M`````````````````````````````````````````````````````````````
  736. M`````````````````````````````````````````````````````````````
  737. M`````````````````````````````````````````````````````````````
  738. M`````````````````````````````````````````````````````````````
  739. M`````````````````````````````````````````````````````````````
  740. M`````````````````````````````````````````````````````````````
  741. M`````````````````````````````````````````````````````````````
  742. M`````````````````````````````````````````````````````````````
  743. M`````````````````````````````````````````````````````````````
  744. M`````````````````````````````````````````````````````````````
  745. M`````````````````````````````````````````````````````````````
  746. M`````````````````````````````````````````````````````````````
  747. M`````````````````````````````````````````````````````````````
  748. M`````````````````````````````````````````````````````````````
  749. M`````````````````````````````````````````````````````````````
  750. M`````````````````````````````````````````````````````````````
  751. M`````````````````````````````````````````````````````````````
  752. M`````````````````````````````````````````````````````````````
  753. M`````````````````````````````````````````````````````````````
  754. M`````````````````````````````````````````````````````````````
  755. M`````````````````````````````````````````````````````````````
  756. M````````````````````````````;6%T:&EE965D;W5B8F%S+FQI8G)A<GD`%
  757. M`````````````````````````````````````````````````````````````
  758. M`````````````````````````````````````````````````````````````
  759. M`````````````````````````````````````````````````````````````
  760. M`````````````````````````````````````````````````````````````
  761. M`````````````````````````````````````````````````````````````
  762. M`````````````````````````````````````````````````````````````
  763. M`````````````````````````````````````````````````````````````
  764. M`````````````````````````````````````````````````````````````
  765. M`````````````````````````````````````````````````````````````
  766. M`````````````````````````````````````````````````````````````
  767. M`````````````````````````````````````````````````````````````
  768. M`````````````````````````````````````````````````````````````
  769. M`````````````````````````````````````````````````````````````
  770. M`````````````````````````````````````````````````````````````
  771. M`````````````````````````````````````````````````````````````
  772. M``````````/L````!0````(```9(```&"```!@P```80```&%`````````/R)
  773. M```#Z0``"CPCSP```#`CP````#@CR````#PL>0````0CS@````23R4ZN_MHH,
  774. M0$JL`*QG``$(80`",I'(("P`K.6((#`($.6(2.<`,$7Y````P$?Y````0"!`W
  775. M<``0&$(P"``FR"`Y````."!Y````/$/P"``,(0`@4LC_^D(I``$2&&=<#`$`G
  776. M(&?V#`$`"6?P)LH,`0`B9Q04P1(89T(,`0`@9P04P6#R0AI@U!(89S`,`0`BK
  777. M9_(,`0`J9B`2&`P!`$YG!@P!`&YF!'(*8`X,`0!%9P8,`0!E9@)R&Q3!8,Q"`
  778. M$D*3(#P````\D(M&@.2(3-\,`$AY````0"\`3KD```!,(\`````8(\`````D(
  779. M3KD```!<(\`````<(\`````@(\`````H(\`````L3KD``"&`<``N>0```#!.\
  780. M=6$``2QA``$6(\`````T+P!"IR1`("H`)&<0+'D````(($`B*```3J[_@D'Y!
  781. M```*]`P0``!G4"(()#P```/M+'D````(3J[_X@R``````&=$(\`````8(\``J
  782. M```<(\`````@(\`````D(\`````H(\`````L*4``G"E``*#EB"!`*6@`"`"D8
  783. M3KD``"&`<`!@!"`O``1*N0```#1G$B(Y````&&L*+'D````(3J[_W"YY````2
  784. M,"\`+'D````$(#D````(9P8B0$ZN_F(@.0````QG!B)`3J[^8B`Y````$&<&Z
  785. M(D!.KOYB2KD````T9PY.KO]\(GD````T3J[^AB`?3G5(YP$&+CP``X`'+'@``
  786. M!$ZN_Y1,WV"`<&1@`/]Z0>P`7$ZN_H!![`!<3J[^C$YU0_H`$G``3J[]V"/`3
  787. M````"&?`3G5D;W,N;&EB<F%R>0!.<4Y6^[A(YQ\\)BX`#$7Y```*P$?Y```A$
  788. M_DGY```!Q$OY```$_'H`?`!8@R!#(%`0$`P``"UF``#*($-2D"!0$!!(@$C`;
  789. M3KD``"><```"Y@```&\```,0````8P````````-N6(,@0R`09@``&$AX__Q"Q
  790. MITZ24$](>``*3I-83V````@@0RP06(-@``!R6(,@0R`09@``&$AX__Q"ITZ2<
  791. M4$](>``*3I-83V````@@0RH06(-(>``!2'D```UP3KD```!X4$\CP````<`@R
  792. M.0```<!F```42'C_^D*G3I)03TAX``I.DUA/8```%$AX__Q"ITZ24$](>``*(
  793. M3I-83V``_RQ*AF<``#!(>0``#6XO!DZY```.!%!/*(`@%&8``!1(>/_[+P9.V
  794. MDE!/2'@`"DZ36$]@```20?D```L((`@&@````"`H@$J%9P``5$ZY```+G$ZYW
  795. M```,(DJ`9P``/GX!2H=G```V2'D```'(+P5.N0``!L103R\%3I583R@`9P``%
  796. M"B\$+P5.DE!/3KD```PB2H!F```$?@!@QF```'H@0R`09@``/$AN^[A.N0``\
  797. M!T183TAN^[A(>0```<A.N0``)(A03TAN^[A.E5A/*`!G```,+P1(;ONX3I)01
  798. M3V```#@@0R`09P``,$AY```!R"!#+Q!.N0``!L103R!#+Q!.E5A/*`!G```,T
  799. M+P0@0R\03I)03UB#8,I(>0``!@`O%$ZY```)Z%!/2'D```8`3KD```FB6$\@Z
  800. M%$'Y```+""((!H$````@L(%G```,+Q1.N0``#8183R`Y```!P&<``!`O.0``1
  801. M`<!.N0```&183T*G3I-83TS?//A.7DYU3E;_]$CG'B`J+@`(1?D```"D>`!V&
  802. M`'P`2H5F```,</U,WP1X3EY.=4AX__XO!4ZY````B%!/*`!F```&</]@X$AXB
  803. M``%(>`$$3KD````@4$\F`&8```PO!$Z26$]P_F#`+P,O!$ZY````N%!/2H!F?
  804. M```:+P1.DEA/2'@!!"\#3KD````X4$]P_6"6($,@*``$;```%DAY```&`"\%X
  805. M3KD```C@4$]@``!0+P,O!$ZY````U%!/2H!G```^(`-0@"\`2'D```'(3KD`_
  806. M``8,4$](>0```<A.N0``!/Q83RP`9P``!F```!)(>0```<A.N0``!FA83V"RL
  807. M+P1.DEA/2'@!!"\#3KD````X4$\@!F``_Q).5O_\2.<<`"8N``@H+@`,*@,@;
  808. M0Q`09P``!E*#8/2VA6<``!I3@R!#$!`,```Z9P``"E*#($,0O``O4H,@1!`01
  809. M9P``#B!$4H0B0U*#$I!@["!#0A!,WP`X3EY.=4Y6__Q(YQ@`*"X`"&8```I,>
  810. MWP`83EY.=28$($,0$&<```92@V#T($,0$`P``"]G```8($,0$`P``#IG```,B
  811. MMH1O```&4X-@WB!#$!`,```Z9@``!%*#($-"$&"T3E;_^$CG'@`F+@`(*BX`P
  812. M#'@`2H-G```(2H5F```,<`!,WP!X3EY.=2!#+P@O`TZY```DG%A/4X`@7]'`@
  813. M$!`,```Z9@``"'P!8```!'P`2'C__B\#3KD```"(4$\H`&8```9P`&"Z+P4O/
  814. M!$ZY```'A%!/+P1.N0```*183R`%8*!.5O_\2.<8`"8N``AF```,<`!,WP`8&
  815. M3EY.=2\#0J=.N0```/!83R@`+P1.N0``!X103R\$3KD```#P6$\@`V#23E;[Y
  816. M5$CG'``F+@`,*"X`"&<```A*@V8```QP`$S?`#A.7DYU0B[_C"\#+P1.N0``T
  817. M"%A03R\$3KD```$$6$\H`&<``$A(;O^,+P1.N0``"%A03TJ`9P``+B\#2&[_\
  818. MC$AY```-:$AN^U1.N0``'/;>_``02&[[5"\#3KD``"2(4$]@```&8```!&"JG
  819. M$"[_C&<``!X@0R\(2&[_C$ZY```DG%A/(%_1P!"\`#I@```B($,O""\#3KD`"
  820. M`"2<6$\J`"!?T<40O``Z($/1Q4(H``$@`V``_TI.5O_\2.<<`"@N``PJ+@`((
  821. M=@!*A6<```A*A&8```QP`$S?`#A.7DYU2'@``4AX`01.N0```"!03R8`9@``.
  822. M!G``8-XO`R\%3KD```"X4$]*@&8``!1(>`$$+P-.N0```#A03W``8+H@`U"`.
  823. M+P`O!$ZY```DB%!/2'@!!"\#3KD````X4$\@!&"83E8``$CG&``F+@`,*"X`&
  824. M"&<```A*@V8```QP_TS?`!A.7DYU3KD```J$#(```/H`;```'"\#+SD```'$9
  825. M3KD```GH4$\O`TZY```)HEA/($,@*``$9P``"B!#)B@`!&#N3KD```EX($,A1
  826. M0``$("@`!&8```9PG&"D+P1.N0``"CA83R!#(&@`!""`(!!F```&<)M@B'``]
  827. M8(1.5O_\+P-(>``(3KD```_\6$\F`&<```P@0T*0($-"J``$(`,F'TY>3G5.Z
  828. M5O_\2.<8`"8N``AF```*3-\`&$Y>3G4@0R8H``1*@V<``"(@0R@H``0@0R\0Z
  829. M3KD``">P6$\O`TZY```GL%A/)@1@VF#*3E8``$CG&``F+@`,*"X`"$J#9P``G
  830. M"$J$9@``"DS?`!A.7DYU($,F*``$2H-G```@($,O$$AY```-9"\$3KD``!T<(
  831. MWOP`#"!#)B@`!&#<8,Q.5O_X2.<<`"@N``AF```,<`!,WP`X3EY.=2\$3KD`U
  832. M`"2<6$]2@"H`+P5.N0``#_Q83R8`9P``$B\%+P0O`TZY```H=-[\``P@`V#&:
  833. M3E;_^$CG&`!.N0````!(>``"3KD```!06$\H`$AX``1.N0```%!83R8`3KD``
  834. M```0(`30@TS?`!A.7DYU3E;__$CG'``H+@`(*BX`#"`%#(#____Z;0``@%R`6
  835. M#(`````%;@``=.6`0?D```KV(G`(`$[1```+3@``"S8```M"```+'@``"Q(`X
  836. M``LJ`````$'Y```-5B8(8```1D'Y```-1"8(8```.D'Y```--"8(8```+D'YJ
  837. M```-'"8(8```(D'Y```,T"8(8```%D'Y```,L"8(8```"D'Y```,H"8(2H1GJ
  838. M```:+P,O!$AY```,F$ZY```=9-[\``Q@```2+P-(>0``#)1.N0``'6103R`%C
  839. M3-\`.$Y>3G5.<4Y6```O"D7Y```&&$(2%7P``0`!0BH``C5\``8`!#5\``,`.
  840. M!D*J``@E>0``!@@`#$*J`!!(4D/J`!0@7W`%(MA1R/_\)7D```80`"`E?````
  841. M@```*$ZY```,$"5``"P@*@`L9@``"'`!8```!$*`)%].7DYU3E;_^"!Y```!^
  842. MP"`H`#1.7DYU3E;__$CG$"!%^0``!AAV`$AX`#)(>`#(0J<O*@`H(`H&@```/
  843. M`!0O`$*G+PHO*@`L3KD`````WOP`("8`)7D```8,``P@`TS?!`A.7DYU4F5DQ
  844. M;P``475I=```3F5X="!D:7-K`$EN<V5R="!A(&1I<VL`)7,*`"5S.B`E<PH`S
  845. M9W)I979O=7,@97)R;W(``$-O=6QD;B=T(&]P96X@:6YT=6ET:6]N+FQI8G)A+
  846. M<GD`57-A9V4Z('%C870@6RUO(&]U='!U=&9I;&5=(%LM8R!D<FEV96YA;65=+
  847. M(&]R(`IQ8V%T(%LM;R!O=71P=71F:6QE72!D:7)N86UE`$-A;B=T(&]P96X@8
  848. M;W5T<'5T(&9I;&4``$9I;&4@;F]T(&9O=6YD``!#;W5L9&XG="!E>&%M:6YEE
  849. M``!/=70@;V8@;65M;W)Y`"5S"@`E<R\E<P!W`&EN='5I=&EO;BYL:6)R87)YD
  850. M`$YQ3E8``"\#)BX`"&<``'(,@P``"PAG```J0?D```L((`@&@````""V@&<`U
  851. M`!9!^0``"P@@"`:`````0+:`9@``""8?3EY.=2\#3KD``"5(6$\@0R\03KD`?
  852. M```<6$\@0R\H``P@0R\H`!I.N0```#A03TAX`"`O`TZY```E+%!/8,!.5O_LS
  853. M2.<?,"1N``PF;@`(+#P```$`>``,A@````%L```$?`%V`'H`#(4````4;```:
  854. M,D'Y```+""`((@7K@="!($`@*``:9@``%D'Y```+""`((@7K@="!)@!@```&N
  855. M4H5@QDJ#9P`!`A`2#```<F8``!HN/````^T0*@`!#```*V8```@N/````^T0X
  856. M$@P``'=F```Z+CP```/N$"H``0P``"MF```H2'@#[2\+3KD`````4$\H`&<`O
  857. M`!1(>``!0J<O!$ZY````;-[\``Q*A&8``!`O!R\+3KD`````4$\H`$J$9P``!
  858. M;"!#((0@0R%&``P@0T)H`!X@0T*H``@@0T*H``1"IR\&3KD````@4$\@0R%`"
  859. M`!H@*``:9P``)$*G0J<O!$ZY````;-[\``P@0R%``!0B0R-H`!0`$&```!`OP
  860. M!$ZY````'%A/8```!F```!I(>``@+P-.N0``)2Q03W``3-\,^$Y>3G4@`V#T\
  861. M3E;_\$CG'@!X_W8`#(,````4;```)"`N`!!!^0``"P@B""0#ZX+2@K"!9@``4
  862. M""@#8```!E*#8-0,A/____]G``!(+RX`#"\N``A.N0``#@103RP`+P9.N0``+
  863. M(W!83RH`2'@`@"\%+P1.N0``)+#>_``,0?D```L((`@B!.N!T(%,WP!X3EY.!
  864. M=7``8/1.5O_\2.<8($7Y```-B"@N``A"IR`$!H`````0+P!.N0```"!03R8`N
  865. M(!)G```((%(A0P`$($,@DB!#(4H`!"`$!H`````0($,A0``()(,@`P:`````X
  866. M#$S?!!A.7DYU3E;_^$CG&``O+@`,+RX`"$ZY```E]"`?6$\H`"\$3KD``")XT
  867. M6$\F`"\$+P-.N0``)2Q03R`#3-\`&$Y>3G5.5O_T2.<>`"@N``@O+@`,3KD`P
  868. M`")X6$\F`&<``#0@!`2`````$"P`($8@*``(!(`````0*@`O!2\#+P1.N0``Z
  869. M)&C>_``,+P1.N0``(]183R`#3-\`>$Y>3G5.<4Y6__1(YQ\`)BX`""HN``Q!D
  870. M^0``"DP@"`:`````?R@`($1"$`R#@````&8``%@@!4ZY```GG```$4H````(Y
  871. M```16@````H``!%D````$````````!%N0?D``!YV(`A,WP#X3EY.=4'Y```>9
  872. M:B`(8.Y!^0``'F`@"&#D0?D``!Y8(`A@VDJ#;```"'`!8```!$*`+@!G```(+
  873. M(`-$@"8`+P4O`TZY```G!B`?6$\L`"\%+P-.N0``)F8@'UA/)@`@>0``!DC1V
  874. MQE.$(D02D$J#;LY*AV<```I3A"!$$+P`+2`$8`#_?$Y6_\A(YQ\`*BX`$`R%5
  875. M````(&\```1Z!D'Y```>4$/N``@@*0``(BD`!$ZY```A+DJ`;```"'`!8```Q
  876. M!$*`+@!G```@0>X`""`H```B*``$3KD``"$>0>X`""%````A00`$0>X`""\H:
  877. M``0O*```3KD``!ZH4$]![O_8(4```"%!``1![O_80^X`""`I```B*0`$3KD`R
  878. M`"$&0>[_X"%````A00`$0?D```I,)@A\`+R%;```CD'Y```>2$/N_^`@*0``J
  879. M(BD`!$ZY```@OD'N_^`A0```(4$`!$'N_^`O*``$+R@``$ZY```>J%!/+P$@%
  880. M`"(?3KD``"%F*``&```P($-2@Q"`(`1.N0``(59![O_@+P$O`"`H```B*``$:
  881. M+5__R"U?_\Q![O_(3KD``"$&0>[_X"%````A00`$4H9@`/]P($-2@T(0<#]!$
  882. M^0``"DPB""0%1(+2@M"!)@!(>0``"DPO`TZY```DB%!/4X,@0Q"\`"Y!^0``[
  883. M'D!#[O_8("D``"(I``1.N0``(-8O`2\`3KD``!ZH4$]![O_0(4```"%!``1!,
  884. M^0``'CA#[O_0("D``"(I``1.N0``(+Y![O_8+P$O`"`H```B*``$+5__R"U?F
  885. M_\Q![O_(3KD``"$&+P$@`"(?3KD``"%F*``&```P4X,@0Q"`0>[_T$/N_]@C>
  886. M:``````C:``$``1!^0``'C!#[O_8("D``"(I``1.N0``(2Y*@&X`_TY*AV<`V
  887. M``I3@R!#$+P`+2`#3-\`^$Y>3G5.5O_(2.<?("XN`!`,AP```"!O```$?@9!A
  888. M^0``'BA#[@`(("D``"(I``1.N0``(2Y*@&P```AP`6````1"@"1`(`IG```@0
  889. M0>X`""`H```B*``$3KD``"$>0>X`""%````A00`$>`!!^0``'B!#[@`(("D`#
  890. M`"(I``1.N0``(2Y*@&<``(Y!^0``'AA#[@`(("D``"(I``1.N0``(2Y*@&T`R
  891. M`"I!^0``'A!#[@`(("D``"(I``1.N0``(-9![@`((4```"%!``12A&"Z0?D`(
  892. M`!X(0^X`""`I```B*0`$3KD``"$N2H!L```J0?D``!X`0^X`""`I```B*0`$6
  893. M3KD``""^0>X`""%````A00`$4X1@ND'N``@O*``$+R@``$ZY```>J%!/0>[_7
  894. MV"%````A00`$0>[_V$/N``@@*0``(BD`!$ZY```A!D'N_^`A0```(4$`!$'YS
  895. M```*3"8(>@"ZAVP``(Y!^0``'?A#[O_@("D``"(I``1.N0``(+Y![O_@(4``$
  896. M`"%!``1![O_@+R@`!"\H``!.N0``'JA03R\!(``B'TZY```A9BP`!@``,"!#V
  897. M4H,0@"`&3KD``"%60>[_X"\!+P`@*```(B@`!"U?_\@M7__,0>[_R$ZY```A4
  898. M!D'N_^`A0```(4$`!%*%8`#_<"!#4H,0O`!%2H1M```.($-2@Q"\`"M@```0R
  899. M($-2@Q"\`"T@!$2`*`!Z`DJ%;0``,DAX``HO!$ZY```G!B`?6$\L``8``#`@$
  900. M0]'%$(!(>``*+P1.N0``)F8H'UA/4X5@RB!#0B@``W`Y0?D```I,(@@D!T2"-
  901. MTH+0@28`2'D```I,+P-.N0``)(A03U.#($,0O``N0?D``!WP0^[_V"`I```B3
  902. M*0`$3KD``"#6+P$O`$ZY```>J%!/0>[_T"%````A00`$0?D``!WH0^[_T"`I"
  903. M```B*0`$3KD``""^0>[_V"\!+P`@*```(B@`!"U?_\@M7__,0>[_R$ZY```AW
  904. M!B\!(``B'TZY```A9BP`!@``,%.#($,0@$'N_]!#[O_8(V@`````(V@`!``$T
  905. M0?D``!W@0^[_V"`I```B*0`$3KD``"$N2H!N`/].(`IG```*4X,@0Q"\`"T@?
  906. M`TS?!/A.7DYU3E;_]$CG&``H+@`00?D``!W80^X`""`I```B*0`$3KD``"$NS
  907. M2H!L```80>X`""`H```B*``$3KD``"$>8```#D'N``@@*```(B@`!$'N__0A?
  908. M0```(4$`!$'Y```=T$/N__0@*0``(BD`!$ZY```A+DJ`;@``($'Y```=R$/N'
  909. M__0@*0``(BD`!$ZY```A+DJ`;```(B\$0>X`""\H``0O*```3KD``!06WOP`@
  910. M#$S?`!A.7DYU+P1![@`(+R@`!"\H``!.N0``$=C>_``,)@`O`TAY```*3$ZYF
  911. M```DB%!/2H1O```L0?D```I,)@@@0Q`09P``!E*#8/13@R!#$!`,```P9@``&
  912. M"B!#4X-"$&#L0?D```I,(`A@E$Y6__A(YQP`*BX`"'@`0?D```I,)@A!^0``#
  913. M"DPF""!%$!!G```0($52A2)#4H,2D%*$8.JXK@`,;```$"`N`!`@0U*#$(!2>
  914. MA&#J($-"$$'Y```*3"`(3-\`.$Y>3G5.5O_X2.<<`"@N``@O!$ZY```DG%A/R
  915. M*@!!^0``"DPF""`%4H6PK@`,;```#B`N`!`@0U*#$(!@Z"\$+P-.N0``)(A0>
  916. M3T'Y```*3"`(3-\`.$Y>3G5.5@``2.<<`"8N``@H+@`,*BX`$$J$;P``&"\%W
  917. M+P0O`TZY```8V-[\``PF`&```!Y*A&P``!@O!2`$1(`O`"\#3KD``!AZWOP`H
  918. M#"8`(`-,WP`X3EY.=4Y6_]9(YQ\\)FX`$$OY```0]"@N``PF+@`(($,0$&<`^
  919. M`TH@0Q`02(!(P$ZY```GG```&<(````E````````'-Y2@S1\```L/```!``@U
  920. M0Q`0#```+68```AP`6````1"@"U`__0@+O_T9P``!%*#($,0$$B`2,`H0"`,I
  921. M#(`````P9P``!CA\`"`@0Q`0#```*F8```Y2@R!$)%!8A&```#H@0Q`0#```<
  922. M,&T``"X@0Q`0#```.6X``"(@"M"`(@#E@="!($,2$$B!2,'0@02`````,"1`V
  923. M4H-@R"`N__1G```((`I$@"1`($,0$`P``"YF``!64H,@0Q`0#```*F8```Y2,
  924. M@R!$+!!8A&```#Q\`"!#$!`,```P;0``+B!#$!`,```Y;@``(B`&T(`B`.6!'
  925. MT($@0Q(02(%(P="!!(`````P+`!2@V#(($,0$$B`2,!.N0``)YP``!L^````,
  926. M)0``&U8```!C```;<@```&0``!N&````90``&ZH```!F```;S@```&<``!ORX
  927. M````;```&_@```!O```<#````',``!PD````=0``'#@```!X```<@@```%@``
  928. M```````<EAU\`"7_UD'N_]9"*``!0>[_UBH(8``!2B!$(!`=0/_60>[_UD(H)
  929. M``%![O_6*@A8A&```2Y(>``*($0O$$Z54$\J`%B$8``!&B\&($0O*``$+R@`=
  930. M`$ZY```4%M[\``PJ`%"$+#P```0`8```]B\&($0O*``$+R@``$ZY```1V-[\L
  931. M``PJ`%"$+#P```0`8```TB\&($0O*``$+R@``$ZY```78M[\``PJ`%"$+#P`_
  932. M``0`8```KE*#8`#^TDAX``@@1"\03I503RH`6(1@``"4($0J$%B$2H5F```*W
  933. M0?D``!W`*@A@``!\2'@`"B!$+Q!.E5!/*@!8A&```&A(>``0($0O$$Z54$\J!
  934. M`"X%($<0$&<``"X@1Q`0#```06T``!X@1Q`0#```6FX``!(@1Q`02(!(P`8`X
  935. M`"`@1Q"`4H=@S%B$8```'DAX`!`@1"\03I503RH`6(1@```*0?D``!VX*@@O+
  936. M!4ZY```DG%A/L(9O```(($71QD(0+PPO"B\%3KD``!DLWOP`#"H`($40$&<`>
  937. M``X@15*%(DM22Q*08.Q@```*($,B2U)+$I!2@V``_+)"$TS?//A.7DYU3E8`E
  938. M`"\#)BX`""\#2&X`$"\N``Q.N0``&8+>_``,(`,F'TY>3G5.5O_\+P-!^0``9
  939. M!DPF""\#2&X`$"\N``Q.N0``&8+>_``,+RX`""\#3KD``"2<6$\O`$AX``$O-
  940. M`TZY```?@-[\`!`F'TY>3G5.5O_\+P-!^0``!DPF""\#2&X`#"\N``A.N0``R
  941. M&8+>_``,0?D```L((`@&@````"`O`"\#3KD``"2<6$\O`$AX``$O`TZY```?S
  942. M@-[\`!`F'TY>3G4M3T]04RT``"AN=6QL*0``.\><H0R20BM$%:\=>+6,0```M
  943. M``````````````````!`)````````$`D````````0"0```````!`)```````0
  944. M`#_P````````0"0```````!`)```````````````````````````````````W
  945. M`````$`D````````0"0```````!`)```````````````````+4]/4%,M```X_
  946. M,#`P,#`P,```+3(Q-#<T.#,V-#@`,C`P,#`P,#`P,#``,#$R,S0U-C<X.4%"N
  947. M0T1%1D=(24I+3$U.3U!14E-455976%E:``!.5O_\0>X`""`H```B*``$3KD`/
  948. M`"%F+4#__"`N__Q.N0``(59.7DYU3E;_^$'N``@O*``$+R@``$ZY```>J%!/5
  949. M0>[_^"%````A00`$0>[_^$/N``@@*0``(BD`!$ZY```A+DJ`;```'D'Y```?G
  950. M=D/N__@@*0``(BD`!$ZY```@[DY>3G5![O_X("@``"(H``1@[F#L3E8``$'YN
  951. M```?;D/N``@@*0``(BD`!$ZY```@[B\!+P!.N0``'JA03TZY```A5DY>3G4_J
  952. MX````````#_P````````3G%.5O_T2.<?("8N`!0N+@`()&X`#'P`+PHO+@`0?
  953. M3KD``"7T(!]83RH`($,@*``,($.0J``$L(5L```2($,@*``,($.0J``$8```O
  954. M!"`%*``O!"!#("@`&B!#T*@`!"\`+P=.N0``)&C>_``,W(2:A-Z$($/9J``4>
  955. M($/9J``$($,@*``(($.PJ``$;```#"!#(D,C:``$``@@0P`H``$`&$J%9P``+
  956. M)B\#3KD``"5(6$\H``R$_____V8```P@!$S?!/A.7DYU8```!F````9@`/]:8
  957. M+P-.N0``)4A83R\*+P9.N0``)F8@'UA/8-).<4CGP,`@.0````QF```^0_D`9
  958. M``K,<``L>0````1.KOW8(\`````,9@``(DCG`08N/``#@`4L>``$3J[_E$S?!
  959. M8(!(>`!D3KD``"'^+$!,WP,#3G5(YS`"3KD``"!L3-@`#$ZN_[),WT`,3G5(=
  960. MYS`"3KD``"!L3-@`#$ZN_ZQ,WT`,3G5(YS`"3KD``"!L3-@`#$ZN_[Y,WT`,1
  961. M3G5(YS`"3KD``"!L3-@`#$ZN_[A,WT`,3G4O#DZY```@;$ZN_\0L7TYU2.<P0
  962. M`DZY```@;$S8``Q.KO_63-]`#$J`9@1P`&`(:P1P`6`"</].=2\.3KD``"!L=
  963. M3J[_W"Q?3G4O#DZY```@;$ZN_^(L7TYU0H%.=4*!3G5.<4Y6```O"D7Y```DJ
  964. ML$*Y```-B$AX`H!(>0``"PA.N0``)2Q03TAX`0`O.0```!A"ITZ2WOP`#$AX]
  965. M`0`O.0```!Q(>``!3I+>_``,2'@!`"\Y````($AX``).DM[\``PO+@`,+RX`C
  966. M"$ZY```"A%!/0J=.N0``(?Y83R1?3EY.=4Y6__Q(YQ`P1?D```V(1_D``"-P0
  967. M2'D```L(3I-83T'Y```+""`(!H`````@+P!.DUA/0?D```L((`@&@````$`O8
  968. M`$Z36$\@$F<``!H@4B80(%(O*``(+Q).N0```#A03R2#8.(O+@`(3KD```'$M
  969. M6$],WPP(3EY.=4YQ3E;__$CG&"!%^0``#8@H+@`(0J<@!`:`````$"\`3KD`D
  970. M```@4$\F`"`29P``""!2(4,`!"!#()(@0R%*``0@!`:`````$"!#(4``""2#T
  971. M(`,&@`````Q,WP083EY.=4Y6__A(YQ@`+RX`#"\N``A.N0``)?0@'UA/*``OX
  972. M!$ZY```B>%A/)@`O!"\#3KD``"4L4$\@`TS?`!A.7DYU3E;_]$CG'@`H+@`(E
  973. M+RX`#$ZY```B>%A/)@!G```T(`0$@````!`L`"!&("@`"`2`````$"H`+P4OM
  974. M`R\$3KD``"1HWOP`#"\$3KD``"/46$\@`TS?`'A.7DYU3G%.5O_\2.<8`"8NU
  975. M``@O`TZY```E2%A/0J<@0R`H`!0@0Y"H`!`O`"!#*!`O!$ZY````;-[\``P@>
  976. M0R\H``P@0R\H`!I.N0```#A03TAX`"`O`TZY```E+%!/(`1,WP`83EY.=4YQV
  977. M3E;__$CG&``H+@`(9P``2G#T0?D```KD(@@$@0``"N0D!)2!(@+0@28`($,B[
  978. M0R)I``0BD"!#(!!G```.($,B0R)1(V@`!``$($,O*``(+P-.N0```#A03TS?7
  979. M`!A.7DYU3E;__$CG$"!%^0``#8@@$F<``!H@4B80(%(O*``(+Q).N0```#A04
  980. M3R2#8.),WP0(3EY.=4Y6```O+@`0+RX`""\N``Q.N0``*'3>_``,3EY.=4YQT
  981. M(&\`!")O``@0V6;\("\`!$YU3G$@;P`$2AAF_)'O``13B"`(3G5.<4Y6__Q(3
  982. MYQ@`*"X`$&8```1X`4'Y```+""`((BX`".N!T($F`&<``%)"IR!#(40`#"\H%
  983. M``Q.N0```"!03R!#(4``&B`H`!IG```P0J="IR!#(*X`#"\03KD```!LWOP`$
  984. M#"!#(4``%")#(V@`%``0(`-,WP`83EY.=7``8/1.5@``+RX`#$*G+RX`"$ZYS
  985. M```H1-[\``Q.7DYU3E;_]$CG'B`F+@`(-'P`$'P`($,0*``82(!(P`*`````B
  986. M`6<``'(@0R`H`!0@0Y"H``0J`"`R.`"PA6<``!I"IR`%D+(X`"\`($,O$$ZY"
  987. M````;-[\``P@0R\H``0@0R\H`!H@0R\03KD````PWOP`#"@`($.XJ``$9P``Y
  988. M#'S_2H1L```$>``@!="$)8`X`"!#`BC__@`8($-"J``(($-"J``$(`9,WP1XH
  989. M3EY.=4Y6``!(Y_@`2FX`"&8``!Y*;@`,9@``%C`N``K`[@`.+4``"$S?`!].O
  990. M7DYU>`$D+@`(;```!D2"1(0F+@`,;```!D2#1(1"@#`"P,,R`DA"Q,-(0\+#A
  991. MTH)(04)!T(%*A&P```1$@"U```A,WP`?3EY.=4Y6```O`$IN``QF'"`N``AK[
  992. M%H#N``YI$`*```#__RU```@@'TY>3G5(YWP`>@$@+@`(;`1$@$2%)@`B+@`,I
  993. M;`1$@42%*`$,@0`!``!L%$)`2$"`P30`,`.`P4A`,`)(0&`JXHCBB0R!``$`7
  994. M`&ST@,$"@```__\D`"\`+P1A`/\0(!]83[:`;`)3@B`"2H5L`D2`+4``"$S?Y
  995. M`#X@'TY>3G5.5@``2.?X`$IN``QF'"`N``AK%H#N``YI$$)`2$`M0``(3-\`S
  996. M'TY>3G5X`2`N``AL!$2`1(0D`"(N``QL`D2!#($``0``;!!"0$A`@,$P`H#!4
  997. M0D!(0&`L)@'BB.*)#($``0``;/2`P0*```#__R\`+P-A`/YZ(!]83[2`9`*0+
  998. M@Y""1(!*A&P"1(`M0``(3-\`'TY>3G4@7R)8(@EG!K"89O9.T2!03M!.<4Y6,
  999. M__Q(YQ@`*"X`"&<``$IP]$'Y```*^"((!($```KX)`24@2("T($F`"!#(D,BD
  1000. M:0`$(I`@0R`09P``#B!#(D,B42-H``0`!"!#+R@`""\#3KD````X4$],WP`8*
  1001. M3EY.=4Y6__Q(YQ`@1?D```V((!)G```:(%(F$"!2+R@`""\23KD````X4$\DO
  1002. M@V#B3-\$"$Y>3G5.5O_T2.<>`"HN``@L!2@N``PF+@`02H-O```,($92AA"$`
  1003. M4X-@\"`%3-\`>$Y>3G5.5O_T2.<?`"PN`!`N+@`(2H9N```,(`=,WP#X3EY.>
  1004. M=2HN``PH![J$;@``."`&4X`B!=*`(`&PA&T``"@@!E.`VH`@!E.`V(`F!DJ#E
  1005. M;P``$"!%4X4B1%.$$I!3@V#L8```&"8&2H-O```0($52A2)$4H02D%.#8.P@)
  1006. M!V"<```#[````&L````!```H&@``)\0``"?,```DQ```)#X``"/H```C\```F
  1007. M(H(``"'0```AO```(:H``"&8```B%```(AX``"(R```AC@``(@@``"!R```@+
  1008. MC@``('P``!V(```1!@``$;0``!)^```3(@``$S0``!5J```6;@``%H```!@T<
  1009. M```82```&'(``!B*```8D@``&,H``!CR```9'@``'20``!UL```0!@``#C@`_
  1010. M``Y0```/C```#^0```V4```-G@``#;(```ND```+Q@``"^(```P6```,+```^
  1011. M#&````.Z```$N@```IX```-*```#4````^H```0Z```$;```!)H```2J```$2
  1012. MV```!.(```62```%O@``!<P```7D```)&````6`````"````"`````X````:&
  1013. M````1@```$P```!>````9````-X```#N````_````0(```$.```!%````1H`>
  1014. M``$@```!+@```3X```%0```!=````88```&,```!D@```9@```&>```!I```9
  1015. M`<H```'2```!V@```>0```'R```"`````@X```(<```"*````FX```#H````#
  1016. M`@``)3P``"1Z```CP@``(X```"->```C4@``(P0``"+H```B]@``(R8``")H;
  1017. M```B#@``(>@``"&>```AB```(?(``""R```@Q```(-P``"#T```A#```(2(`J
  1018. M`"$T```A6@``(6H``"!@```@*```(%0``!_B```?G@``'R0``!]4```?!@``P
  1019. M'L@``!]F```>N@``'N(``!\2```?0@``'UX``!U6```=J@``&.@``!RB```=G
  1020. M1@``'9H``!->```4S```%JH``!,\```6B```&#H``!D6```2X```%<P``!+,M
  1021. M```3O```%;@``!<(```2H```$XX``!42```5C```%MH``!)L```3`@``$[``<
  1022. M`!58```5[@``%OP``!)(```2O@``$V@``!4T```5J@``%K0``!(J```4:@``S
  1023. M%YH``!($```3]```%$(``!20```4K@``%/0``!=````7@@``%\X``!?L```1[
  1024. MJ```%E@``!&8```6/```$28``!FN```:T@``$2H``!$R```1.@``$48``!%,X
  1025. M```17```$68``!%P```1\@``$HX``!-,```3?```$^(``!0P```4?@``%)P`Q
  1026. M`!2Z```4X@``%0```!5Z```6F```%L@``!<N```7<```%[P``!?:```8!@``B
  1027. M&"8``!E.```9;@``&9```!FR```9O@``&M8``!K>```:Y@``&NX``!KV```:1
  1028. M_@``&P8``!L.```;%@``&QX``!LF```;+@``&SH``!N4```;N```&]P``!P:`
  1029. M```<F```'+P``!T,```=-@``'7X``!#B```0U@``$(@``!!Z```0J@``$&P`3
  1030. M``_:```/R```#UP```^\```-_```#<X```OR```+=```"XH```IX```*)@``=
  1031. M"=(```G<```)A```"F0```?N```&]```""````@Z```*5@``!-````1````'3
  1032. M_@``",@```.4```"R@```I@```*2```"I````LX```+6```"X@```SP```.,?
  1033. M```#T````]8```/R```$#@``!"X```1V```$H@``!+````6:```%Q```!=(`X
  1034. M``7J```',```!W````>R```'T```!^0```D&```)'@``"2@```E"```)7```O
  1035. M"AX```KL```*]@``"OH```K^```+`@``"P8```L*```+%```"R````LL```+I
  1036. M.```"T0```M0```+7```"VX```N$```!)@```;P````6`````P``);```"66>
  1037. M```E"```(YX```]&```.R```#R@```ZR```.W```#=H```>\```'9```!WH`0
  1038. M``6J```%8@``"*````4L```'&@``!0H```<Z```!"````/8````7````!```Z
  1039. M*`(``"@R```DY@``)"8``"16```CM```(I@``")8```0'```#PP```WN```*I
  1040. ML```"I@```JF```*C@``!7P```8````(M```"-8```5&```(B@``!.@```-")
  1041. M`````0````4```Q4`````````_(```/I````1DCG(`),[P`&``PL>0````A.F
  1042. MKO_B3-]`!$YU```O#B(O``@L>0````A.KO_<+%].=4CG,`),[P`.`!`L>0``(
  1043. M``A.KO_03-]`#$YU```O#BQY````"$ZN_\HL7TYU+PXL>0````A.KO_$+%].,
  1044. M=4CG,`),[P`.`!`L>0````A.KO^^3-]`#$YU``!(YR`"3.\`!@`,+'D````(:
  1045. M3J[_K$S?0`1.=0``+PXB+P`(+'D````(3J[_IBQ?3G5(YR`"3.\`!@`,+'D`.
  1046. M```(3J[_FDS?0`1.=0``2.<@`DSO``8`#"QY````"$ZN_Y1,WT`$3G4``"\.8
  1047. M(B\`""QY````"$ZN_X(L7TYU+PXB+P`(+'D````(3J[_+BQ?3G4```/L````Z
  1048. M#`````$```$,````^````.````#$````K````)0```!X````8````%`````\:
  1049. M````)`````P````````#\`````-?4&%R96YT1&ER`"4```$$`````U]#=7)RV
  1050. M96YT1&ER`````/`````"7T5X3F5X=`````#4`````E]%>&%M:6YE````N```'
  1051. M``)?56Y,;V-K`````*0````"7TQO8VL`)>D```"(`````E]3965K`"7I````(
  1052. M;`````)?3W5T<'5T`````%P````"7TEN<'5T`"4```!,`````E]7<FET90`EM
  1053. M````,`````)?0VQO<V4`)0```!P````"7T]P96X`)>D``````````````_(`^
  1054. M``/I````)"\.+'D````$3J[_?"Q?3G4O#BQY````!$ZN_W8L7TYU+PXL>0``"
  1055. M``1,[P`#``A.KO\Z+%].=0``+PXL>0````0B;P`(("\`#$ZN_RXL7TYU+PXL'
  1056. M>0````0B+P`(3J[_*"Q?3G4O#BQY````!")O``A.KOYB+%].=2\.+'D````$6
  1057. M(F\`""`O``Q.KOW8+%].=0```^P````'`````0```'P```!H````5````#P`^
  1058. M```D````%`````0````````#\`````-?3W!E;DQI8G)A<GD```!X````!%]#6
  1059. M;&]S94QI8G)A<GD`)>D```!D`````U]!=F%I;$UE;0`EZ0```%`````"7T9R?
  1060. M965-96T````X`````U]!;&QO8TUE;0`EZ0```"`````"7U!E<FUI=``````0=
  1061. M`````E]&;W)B:60```````````````/R```#Z0````U(YS`R+'D```'`(&\`K
  1062. M&")O`!PD;P`@)F\`)"`O`"@B+P`L)"\`,"8O`#1.KOZD3-],#$YU```#[```$
  1063. M``$````!````!@````````/P`````U]!=71O4F5Q=65S=``````````````#B
  1064. !\@$`S
  1065. ``
  1066. end
  1067. size 16696
  1068. SHAR_EOF
  1069. #    End of shell archive
  1070. exit 0
  1071. -- 
  1072. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  1073. Have five nice days.
  1074.